/**
 * @file Star.h
 *
 * Reprezentacja gwiazdy zmiennej - nagłówek.
 *
 * @author Zbigniew Siciarz
 * @date 2009
 * @version 2.0.0
 * @since 2.0.0
 */

#ifndef STAR_H_
#define STAR_H_

#include <QMap>
#include <QMetaType>
#include <QString>

namespace Dogz
{
    /**
     * Reprezentacja pojedynczej gwiazdy zmiennej.
     *
     * Może być kopiowana przez wartość, domyślny konstruktor kopiujący
     * i operator przypisania wystarczą.
     *
     * Klasa nie zamierza być klasą bazową - destruktor nie jest wirtualny!
     */
    class Star
    {
    public:
        Star(): m_name("-invalid-") {}
        Star(const QString& name);
        ~Star() {}

        void setName(const QString& name) { m_name = name; }
        QString getName() const { return m_name; }

        void setDesignation(const QString& designation) { m_designation = designation; }
        QString getDesignation() const { return m_designation; }

        void setAuid(const QString& auid) { m_auid = auid; }
        QString getAuid() const { return m_auid; }

        void setType(const QString& type) { m_type = type; }
        QString getType() const { return m_type; }

        void setMagnitudeRange(float maxMagnitude, float minMagnitude);
        float getMaxMagnitude() const { return m_maxMagnitude; }
        float getMinMagnitude() const { return m_minMagnitude; }

        void setPeriod(double period) { m_period = period; }
        double getPeriod() const { return m_period; }

        void setEpoch(double epoch) { m_epoch = epoch; }
        double getEpoch() const { return m_epoch; }

        bool isPeriodical() const;
        double getPhase(double jd) const;

        static QString normalizeStarName(const QString& name);
        static QString fixGreekLetter(const QString& name);

        static Star invalid() { return Star("-invalid-"); }
        bool isValid() { return "-invalid-" != m_name; }

    private:
        /**
         * Nazwa zmiennej - QString może być efektywnie kopiowany przez wartość.
         */
        QString m_name;

        /**
         * Desygnacja harvardzka - obecnie powoli wycofywana.
         */
        QString m_designation;

        /**
         * Unikalny identyfikator AAVSO - nowy standard.
         */
        QString m_auid;

        /**
         * Typ zmienności.
         */
        QString m_type;

        /**
         * Jasność maksymalna - liczbowo mniejsza od minimalnej.
         */
        float m_maxMagnitude;

        /**
         * Jasność minimalna - ale liczbowo większa niż maksymalna.
         */
        float m_minMagnitude;

        /**
         * Okres zmian jasności dla gwiazd okresowych.
         */
        double m_period;

        /**
         * Epoka - moment pewnego początkowego minimum/maksimum.
         */
        double m_epoch;

        /**
         * Mapowanie nazw gwiazdozbiorów - dla normalizacji nazwy gwiazdy.
         */
        static QMap<QString, QString> constellations;

        static void initConstellations();

        /**
         * Greckie litery - normalizacja.
         */
        static QMap<QString, QString> greekLetters;

        /**
         * Tworzy mapowanie do normalizacji greckich liter.
         */
        static void initGreekLetters();


        void guessName(const QString& name);
    };
}

// konieczne, żeby można było przekazywać obiekty typu Star jako parametry
// sygnałów i slotów (ponadto qRegisterMetaType - patrz funkcja main)
Q_DECLARE_METATYPE(Dogz::Star)

#endif /* STAR_H_ */
